﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Globalization;

//namespace JoyeriaProject
//{
  
//    class InfoLoad
//    {
//        public List<Totales> Totales;
//        private DatabaseManager DBManager;
//        IFormatProvider culture = new CultureInfo("en-US", true);
//        string[] CustomerIDs;

//        public InfoLoad(int Check = 0)
//        {
//           DBManager = new DatabaseManager();
//           Totales = new List<Totales>();

//           if (Check == 0)
//           {
//               CustomerIDs = DBManager.ReadFromDB("Select CustomerID From CUSTOMER");

//               foreach (string ID in CustomerIDs)
//               {
//                   LoadCustomerData(ID);
//               }
//           }
//        }

//        public void RefreshCustomersInfo()
//        {
//           Totales.Clear(); 

//           foreach (string ID in CustomerIDs)
//              LoadCustomerData(ID);
//        }

//        private void LoadCustomerData(string CustomerID)
//        {
//            string[] CompleteCustomerData = DBManager.ReadFromDB("SELECT Customer.DiaCobro, Customer.TipoAbono, Customer.MontoAbono,  Mid(Payments.Fecha,1,2) & '/' & Mid(Payments.Fecha,3,2)  & '/' & Mid(Payments.Fecha,5,4)  AS Fecha, Payments.Cargo, Payments.Abono, Payments.Saldo FROM Customer INNER JOIN Payments ON Customer.CustomerID = Payments.CustomerID Where Customer.CustomerID = " + CustomerID + " Order By Payments.Fecha");

//            if (CompleteCustomerData.Count() > 0)
//            {
//                List<CustomerRawData> customerRawData = new List<CustomerRawData>();

//                foreach (string CustData in CompleteCustomerData)
//                    LoadCustomerRawData(ref customerRawData, CustData.Split(','));
              
//                //////////////////////////////////////////////////////////////////////////////////////////
//                //string[] InitialData = CompleteCustomerData[0].Split(',');
//                double CicloAbono;

//                DateTime FechaPagoInicial = customerRawData.Min(n => n.Fecha);//DateTime.ParseExact(InitialData[3], "MM/dd/yyyy", culture);
//                DateTime FechaPagoFinal = customerRawData.Min(n => n.Fecha); //DateTime.ParseExact(InitialData[3], "MM/dd/yyyy", culture);
//                CicloAbono =Convert.ToDouble( customerRawData.Min(n => n.TipoAbono));//Convert.ToDouble(InitialData[1]);

//                while (FechaPagoFinal.Date.DayOfWeek != (DayOfWeek)customerRawData.Min(n => n.DiaCobro))//Convert.ToInt32(InitialData[0]))
//                   FechaPagoFinal = FechaPagoFinal.AddDays(1);

//                FechaPagoFinal = FechaPagoFinal.AddDays(CicloAbono);
               
//                //////////////////////////////////////////////////////////////////////////////////////////

  
//                while (DateTime.Compare(FechaPagoInicial, DateTime.Now) <= 0)
//                {
//                    List<CustomerRawData> FilteredData = (from n in customerRawData
//                             where n.Fecha <= FechaPagoFinal && n.Fecha >= FechaPagoInicial
//                             select n).ToList();

//                    AgregarPeriodoTotal(CustomerID, FilteredData, FechaPagoFinal);


//                    FechaPagoInicial = FechaPagoFinal.AddDays(1);
//                    FechaPagoFinal = FechaPagoFinal.AddDays(CicloAbono);
//                }
//            }
            
//        }

//        private void LoadCustomerRawData(ref List<CustomerRawData> customerRawDataList, string[] CustomerData)
//        {
//            CustomerRawData customerRawData = new CustomerRawData();

//            customerRawData.DiaCobro =  Convert.ToInt32(CustomerData[0]);
//            customerRawData.TipoAbono =  Convert.ToInt32(CustomerData[1]);
//            customerRawData.MontoAbono = Convert.ToDouble(CustomerData[2]);
//            customerRawData.Fecha = DateTime.ParseExact(CustomerData[3], "MM/dd/yyyy", culture);  
//            customerRawData.Cargo = (CustomerData[4] =="" ? 0 : Convert.ToDouble(CustomerData[4]));
//            customerRawData.Abono = (CustomerData[5] =="" ? 0 : Convert.ToDouble(CustomerData[5]));
//            customerRawData.Saldo = (CustomerData[6] =="" ? 0 : Convert.ToDouble(CustomerData[6]));

//            customerRawDataList.Add(customerRawData);
//        }

//        private void AgregarPeriodoTotal(string CustomerID, List<CustomerRawData> CustomerRawDataList, DateTime Fecha)
//        {
//            Totales Total = new Totales();

//            Total.CustomerID = Convert.ToInt32(CustomerID);
//            Total.Fecha = Fecha;
//            Total.DiasParaPagar = AgregarPeriodoSubTotal(CustomerRawDataList);

//            Total.Cargo = Total.DiasParaPagar.Sum(n => n.Cargo);
//            Total.Abono = Total.DiasParaPagar.Sum(n => n.Abono);

//            Total.Saldo = Total.Cargo - Total.Abono;

//            Total.metaCumplida = (Total.Abono == 0 ? false : (Total.Abono >= CustomerRawDataList.Min(n => n.MontoAbono)));

//            this.Totales.Add(Total);
//        }

//        private List<Subtotales> AgregarPeriodoSubTotal(List<CustomerRawData> CustomerRawDataList)
//        {
//            List<Subtotales> subtotales = new List<Subtotales>();

//            foreach (CustomerRawData element in CustomerRawDataList)
//            {
//                Subtotales subtotal = new Subtotales();

//                subtotal.Cargo = element.Cargo;
//                subtotal.Abono = element.Abono;
//                subtotal.Fecha = element.Fecha;
//                subtotales.Add(subtotal);
//            }
//            return subtotales;
//        }

//        public int VerificarStatus(string CustID)
//        {
//            // 0 Bueno , 1 Malo , se pueden agregar mas status como regular
//            try
//            {

//                Totales.Clear();
//                LoadCustomerData(CustID);

//                return GetMalosClientes().Single(n => n == Convert.ToInt32(CustID));
                
//            }
//            catch (Exception Ex)
//            {
//                return 0;
//            }
            
//        }

//        public List<int> GetBuenosClientes()
//        {
//            const int BUENOS_CLIENTES = 2; //Tolerancia de ciclos no pagados (Default es 2 seria como estar al dia)
//            List<int> CustomerList = new List<int>();
            
//            var  Counts = from c in Totales
//                          group c by c.CustomerID into g
//                          select new {CustomerID = g.Key, counts = g.Count() };

//            foreach(var CustomerInfo in Counts)
//            {
//                var tt = from n in Totales
//                         where (n.Abono > 0) && (n.CustomerID == CustomerInfo.CustomerID)
//                         group n by n.CustomerID into CustID
//                         select new { CustomerID = CustID.Key, counts = CustID.Count() };
//                try
//                {
//                    if (CustomerInfo.counts - BUENOS_CLIENTES <= (tt.Max(n => n.counts)))
//                        CustomerList.Add(CustomerInfo.CustomerID);
//                }catch(Exception ex)
//                {}
//            }

//            return CustomerList;

//        }

//        public List<int> GetTodosClientes()
//        {
//            List<int> CustomerList = new List<int>();

//            foreach(string CustomerID in CustomerIDs)
//                CustomerList.Add(Convert.ToInt32(CustomerID));

//            return CustomerList;
//        }

//        public List<int> GetMalosClientes()
//        {
//            const int MALOS_CLIENTES = 3;//Tolerancia de ciclos no pagados (Default es 3 seria osea que debe un ciclo de pago x)
//            List<int> CustomerList = new List<int>();

//            var Counts = from c in Totales
//                         group c by c.CustomerID into g
//                         select new { CustomerID = g.Key, counts = g.Count() };

//            foreach (var CustomerInfo in Counts)
//            {
//                var tt = from n in Totales
//                         where (n.Abono > 0) && (n.CustomerID == CustomerInfo.CustomerID)
//                         group n by n.CustomerID into CustID
//                         select new { CustomerID = CustID.Key, counts = CustID.Count() };

//                try
//                {
//                    if (tt.Count() == 0 ?  true : CustomerInfo.counts - (tt.Max(n => n.counts)) > MALOS_CLIENTES)
//                        CustomerList.Add(CustomerInfo.CustomerID);
//                }
//                catch (Exception ex)
//                { }
//            }

//            return CustomerList;
//        }
        
//        public double GetSaldoCliente(string CustID)
//        {
//            Totales.Clear(); 
//            LoadCustomerData(CustID);

//            return (Totales.Sum(n => n.Cargo)) - (Totales.Sum(n => n.Abono));
//        }

//        public DateTime GetFechaUltimoPagoCliente(int CustID)
//        {
//            IFormatProvider culture = new CultureInfo("en-US", true);
           
//            string[] Abonos = (DBManager.ReadFromDB("Select Fecha from Payments Where CustomerID = " + CustID + " AND Cargo < 1"));

//            List<DateTime> UltimoPago = new List<DateTime>();

//            foreach (string element in Abonos)
//                UltimoPago.Add(DateTime.ParseExact(element, "MMddyyyy", culture));

//            return (UltimoPago.Count > 0 ? UltimoPago.Max() : DateTime.Now);
//        }

//        private IEnumerable<DateTime> EachDay(DateTime from, DateTime thru)
//        {
//            for (var day = from.Date; day.Date <= thru.Date; day = day.AddDays(1))
//                yield return day;
//        }  

//    }
//}
